#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   user_manage.py
@Time    :   2024-08-09 12:31:06
@Author  :   chakcy 
@Email   :   947105045@qq.com
@description   :   用户管理服务
'''

from typing import Dict, Any

from fastapi import Request

from ..dao import UserDao
from ..models.common import Page
from ..models import create_response
from ..utils import check_login_status 
from ..utils.user import merge_user_data, merge_users_data

class UserManageService:
    """
    用户管理服务

    方法：
    - get_user_list: 获取用户列表
    - get_user_by_id: 根据用户 ID 获取用户信息
    - get_user_by_name: 根据用户名获取用户信息
    - get_users_by_name: 根据用户名获取用户列表
    - reset_password: 重置密码
    - delete_user: 删除用户
    """
    @staticmethod
    @check_login_status
    async def get_user_list(request: Request, 
                            redis, 
                            page: Page) -> Dict[str, Any]:
        """
        获取用户列表

        参数：
        - data: token 解析后的数据
        - redis: redis 连接
        - page: 分页参数

        返回值：
        - 成功：用户列表
        - 失败：错误信息
        """
        if page.pageNum <=0 or page.pageSize <=0:
            return create_response(data={}, message='分页参数错误', code=400)
        result = await UserDao.getUsers(page)
        res = merge_users_data(result.data)
        return res
    
    @staticmethod
    @check_login_status
    async def get_user_by_id(request: Request,
                             redis,
                             user_id: str) -> Dict[str, Any]:
        """
        根据用户 ID 获取用户信息

        参数：
        - data: token 解析后的数据
        - redis: redis 连接
        - user_id: 用户 ID

        返回值：
        - 成功：用户信息
        - 失败：错误信息
        """
        res = await UserDao.getUserById(user_id)

        if res.result:
            return create_response(data={}, message='用户不存在', code=404)
        
        user, user_personal = res.data
        res = merge_user_data(user, user_personal)
        return create_response(data=res, message='获取用户成功', code=200)
    
    @staticmethod
    @check_login_status
    async def get_user_by_name(request: Request,
                               redis,
                               userName: str) -> Dict[str, Any]:
        """
        根据用户名获取用户信息

        参数：
        - data: token 解析后的数据
        - redis: redis 连接
        - userName: 用户名

        返回值：
        - 成功：用户信息
        - 失败：错误信息
        """
        res = await UserDao.getUserByName(userName)
        if res.result:
            return create_response(data={}, message='用户不存在', code=404)
        user, user_personal = res.data
        res = merge_user_data(user, user_personal)
        return create_response(data=res, message="获取用户成功", code=200)
    
    @staticmethod
    @check_login_status
    async def get_users_by_name(request: Request,
                                redis,
                                userName,
                                page: Page) -> Dict[str, Any]:
        """
        根据用户名获取用户列表

        参数：
        - data: token 解析后的数据
        - redis: redis 连接
        - userName: 用户名
        - page: 分页参数

        返回值：
        - 成功：用户列表
        - 失败：错误信息    
        """
        if page.pageNum <=0 or page.pageSize <=0:
            return create_response(data={}, message='分页参数错误', code=400)
        result = await UserDao.getUsersByName(userName, page)
        res = merge_users_data(result.data)
        return res
    
    @staticmethod
    @check_login_status
    async def reset_password(request: Request,
                             redis,
                             user_id) -> Dict[str, Any]:
        """
        重置密码

        参数：
        - data: token 解析后的数据

        返回值：
        - 成功：重置成功
        - 失败：错误信息
        """
        res = await UserDao.resetPassword(user_id)
        if res.result:
            return create_response(data={}, message=res.message, code=200)
        else:
            return create_response(data={}, message=res.message, code=500)

    @staticmethod
    @check_login_status
    async def delete_user(request: Request,
                          redis,
                          user_id) -> Dict[str, Any]:
        """
        删除用户

        参数：
        - data: token 解析后的数据
        - redis: redis 连接

        返回值：
        - 成功：删除成功
        - 失败：错误信息
        """
        res = await UserDao.deleteUser(user_id)
        if res.result:
            return create_response(data={}, message=res.message, code=200)
        else:
            return create_response(data={}, message=res.message, code=500)
        